import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;

/**
 * ProtobufJsonConverter
 *
 * @author diyiliu
 * @create 2025-09-28 14:39
 **/
public class ProtobufJsonConverter {
    /**
     * 将 Protobuf 消息转换为 JSON 字符串
     * @param message Protobuf 消息对象
     * @return 格式化后的 JSON 字符串
     */
    public static String toJson(Message message) {
        try {
            return JsonFormat.printer()
                    .includingDefaultValueFields()   // 包含默认值字段
                    .preservingProtoFieldNames()     // 保持原始字段名（不转驼峰）
                    .print(message);
        } catch (InvalidProtocolBufferException e) {
            throw new RuntimeException("Protobuf to JSON 转换失败", e);
        }
    }

    /**
     * 将 JSON 字符串解析为 Protobuf 消息
     * @param json JSON 字符串
     * @param builder 对应的 Protobuf Builder
     * @return 解析后的 Protobuf 消息
     */
    public static <T extends Message> T fromJson(String json, Message.Builder builder) {
        try {
            JsonFormat.parser()
                    .ignoringUnknownFields()  // 忽略未知字段
                    .merge(json, builder);
            return (T) builder.build();
        } catch (InvalidProtocolBufferException e) {
            throw new RuntimeException("JSON to Protobuf 转换失败", e);
        }
    }
}
